package logic

import (
	"crypto/md5"
	"encoding/hex"
	"fmt"
	"one-wiki/commons"
	"one-wiki/database"
	"strconv"
	"time"
)

func Login(requestParam commons.LoginRequest) commons.UserLoginResponse {

	// 查询数据库中是否存在该用户
	user, err := database.FindByUserName(requestParam.UserName)

	// 校验密码是否正确
	if err != nil || requestParam.UserName != user.Password {
		panic(commons.CustomClientError("用户名或密码不正确"))
	}

	// 生成 token
	token := generateToken(user.ID)

	// 查询用户拥有的组列表
	groupIds, err := database.ListGroupIdByUserId(user.ID)
	if err != nil {
		panic(commons.ServerError)
	}

	// 存储会话信息
	session := commons.Session{ID: token, UserID: user.ID, Groups: *groupIds}
	err = commons.AddSession(session)
	if err != nil {
		panic(commons.ServerError)
	}

	// 组装响应数据
	resp := commons.UserLoginResponse{
		UserID:   user.ID,
		UserName: user.UserName,
		NickName: user.NickName,
		Token:    token,
		Avatar:   user.Avatar,
	}

	return resp
}

func Register(requestParam commons.UserRegisterRequest) commons.UserRegisterResponse {
	// 检查用户名是否已存在

	// 加密密码

	// 插入新用户数据

	// 组装响应数据

	panic("未实现")

}

func GetUserGroupList(session commons.Session) []commons.UserGroupListItemResponse {

	// 查询用户所属的组列表
	groupList, err := database.ListCustomGroupByUserId(session.UserID)
	if err != nil {
		panic(err)
	}

	// 组装响应数据
	var resp []commons.UserGroupListItemResponse
	for _, group := range groupList {
		// 查询组所有者
		creator, err1 := database.FindUserById(group.CreatorID)
		if err1 != nil {
			panic(err1)
		}

		// 查询入组时间
		userGroup, err2 := database.GetUserGroupByUidAndGid(session.UserID, group.ID)
		if err2 != nil {
			panic(err2)
		}

		item := commons.UserGroupListItemResponse{
			ID:          group.ID,
			Name:        group.Name,
			CreatorID:   group.CreatorID,
			CreatorName: creator.NickName,
			JoinTime:    userGroup.CreateTime,
			CreateTime:  group.CreateTime,
		}
		resp = append(resp, item)
	}

	return resp
}

func ExitGroup(userID, groupID int64) {
	// 从组中移除用户
	err := database.DeleteUserGroup(userID, groupID)
	if err != nil {
		panic(err)
	}
}

// generateToken 生成token
func generateToken(id int64) string {
	// 获取当前时间戳
	now := time.Now().Unix()

	// 将用户信息和当前时间戳拼接成字符串
	str := fmt.Sprintf("%s%d",
		strconv.FormatInt(id, 10), now)

	// 计算MD5值并返回
	return fmt.Sprintf("%x", md5.Sum([]byte(str)))
}

// encryptPassword 加密密码
func encryptPassword(password string) (string, error) {
	hash := md5.Sum([]byte(password))
	return hex.EncodeToString(hash[:]), nil
}

// UserSelfInfo 用户查询个人信息
func UserSelfInfo(session commons.Session) commons.UserSelfResponse {
	user, err := database.FindUserById(session.UserID)
	if err != nil {
		panic(err)
	}
	return commons.UserSelfResponse{
		UserID:     user.ID,
		UserName:   user.UserName,
		NickName:   user.NickName,
		Email:      user.Email,
		CreateTime: user.CreateTime,
		Profile:    user.Profile,
		Avatar:     user.Avatar,
	}
}

// 用户修改个人信息
// 用户修改个人信息
func UserSelfUpdate(session commons.Session, param commons.UserSelfRequest) commons.UserSelfResponse {
	user, err := database.FindUserById(session.UserID)
	if err != nil {
		panic(err)
	}

	// 校验目标用户和当前会话用户是否一致
	if param.UserID != session.UserID {
		panic(commons.CustomClientError("参数异常"))
	}

	// 填充用户信息
	if param.UserName != "" {
		user.UserName = param.UserName
	}
	if param.NickName != "" {
		user.NickName = param.NickName
	}
	if param.Email != "" {
		user.Email = param.Email
	}
	if param.Profile != "" {
		user.Profile = param.Profile
	}
	if param.Avatar != "" {
		user.Avatar = param.Avatar
	}

	// 填充最后更新时间
	user.UpdateTime = time.Now()

	// 保存更改后的用户信息
	err = database.UpdateUser(user)
	if err != nil {
		panic(err)
	}

	// 构造响应
	return commons.UserSelfResponse{
		UserID:     user.ID,
		UserName:   user.UserName,
		NickName:   user.NickName,
		Email:      user.Email,
		CreateTime: user.CreateTime,
		Profile:    user.Profile,
		Avatar:     user.Avatar,
	}
}
